package com.heo.protocol;

import java.net.InetSocketAddress;

import org.apache.log4j.Logger;

import com.heo.protocol.packet.BasePacket;
import com.heo.server.SocketServerHandler;
import com.heo.util.ByteHelper;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;

/**
 * <pre>
 *  
 *  数据包格式 
 * +——------——+——------——+——-----——+——-----——+
 * |消息长度      |命令ID    |消息流水号  | 重发次数 |
 * +——------——+——------——+——-----——+——-----——+
 * </pre>
 */

public class DeviceProtocolEncoder extends MessageToByteEncoder<BasePacket>
{
  private static Logger log = Logger.getLogger(DeviceProtocolEncoder.class);

  @Override
  protected void encode(ChannelHandlerContext ctx, BasePacket msg, ByteBuf out) throws Exception
  {
    String channelId = ctx.channel().id().asShortText();
    String remoteIpAddress = ((InetSocketAddress) ctx.channel().remoteAddress()).getAddress().getHostAddress();
    String logHeader = "[server][" + channelId + "][" + remoteIpAddress + "]";

    // 1.写入消息的开头的信息标志(short类型)
    out.writeShort(msg.getTotalLength());
    // 2.写入命令ID(int 类型)
    out.writeShort(msg.getCommandId());
    // 3.写入消息序号(short 类型)
    out.writeShort(msg.getSequenceId());
    // 4.写入重发次数(short 类型)
    out.writeByte(msg.getSendCount());
    // 5.写入消息的内容(byte[]类型)
    out.writeBytes(msg.getPacketBody());

    log.debug(logHeader + msg.getPacketName() + "--->写入数据流，数据内容：" + msg.toString());

  }
}
